package com.tsf.hbase.jpa.entity;

import com.tsf.hbase.RowKey;
import org.apache.hadoop.hbase.util.Base64;

/**
 * hbase实体的抽象实现，定义每个实体都必须有个{@link #rowKey}类型的唯一键rowKey。
 *
 * @author taoningbo
 * @since 1.0, Created as 2018/11/26
 */
public abstract class HBaseEntity {

    /**
     * 数据行的唯一键
     */
    private byte[] rowKey;

    /**
     * 返回一个字符串类型的rowKey，经过{@link Base64#encodeBytes(byte[])}编码后的字符串结果
     *
     * @return 字符串类型rowKey
     */
    public String rowKeyAsString() {
        if (rowKey == null) {
            throw new IllegalArgumentException("System internal " +
                    "error, should not appear error, rowKey value is empty.");
        }
        return Base64.encodeBytes(rowKey);
    }

    /**
     * 返回一个字节数组类型的rowKey
     *
     * @return rowKey
     */
    public String getRowKey() {
        return rowKeyAsString();
    }

    /**
     * 返回一个字节数组类型的rowKey
     *
     * @return rowKey
     */
    public byte[] rowKey() {
        return rowKey;
    }

    /**
     * 设置一个字节数组类型的rowKey
     *
     * @param rowKey 字节类型的rowKey
     */
    public void setRowKey(byte[] rowKey) {
        this.rowKey = rowKey;
    }

    /**
     * 设置一个{@link RowKey}类型的rowKey
     *
     * @param rowKey 行的唯一主键
     */
    public void setRowKey(RowKey rowKey) {
        this.rowKey = rowKey.build();
    }
}
